home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / cattermi.i < prev    next >
Text File  |  1997-10-26  |  32KB  |  1,047 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE CatTerminal;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *  3.01     | 31.01.92 |  Hp  | Bug in OpenTerminal gefixt, der dazu   *
  29.  *           |          |      | fhrte, daž die falsche Fontgr”že ein- *
  30.  *           |          |      | gestellt wurde.                        *
  31.  *  3.02     | 03.02.92 |  Hp  | Uralt-Bug in Emulator gefixt.          *
  32.  *           |          |      | M„hnie Z„nks to Steffen Engel @ PE     *
  33.  *-----------+----------+------+----------------------------------------*)
  34.  
  35.  
  36.  
  37. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  38. (*                                              *)
  39. (*$R-   Range-Checks                            *)
  40. (*$S-   Stack-Check                             *)
  41. (*                                              *)
  42. (*----------------------------------------------*)
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  52.  
  53.  
  54.  
  55.  
  56. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  57.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  58.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  59.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  60.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  61.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  62.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  63.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. FROM SYSTEM             IMPORT  ADDRESS, ADR, TSIZE;
  71. FROM MagicStrings       IMPORT  Assign, Append, Length;
  72. FROM MagicConvert       IMPORT  CardToStr, IntToStr, LCardToStr, LIntToStr,
  73.                                 LRealToStr, RealToStr, FixRealToStr, FixLRealToStr;
  74. FROM MagicVDI           IMPORT  VDIIntIn, VDIPtsIn, VDICall;
  75. FROM mtAppl             IMPORT  VDIHandle, MaxWidth, MaxHeight, Bitplanes,
  76.                                 CharWidth, CharHeight, BoxWidth, BoxHeight,
  77.                                 OpenWorkstation, CloseWorkstation, MouseOn,
  78.                                 MouseOff, Screen;
  79. FROM FontSelect         IMPORT  FontInfo, FontActive, FontSelect, FontSize,
  80.                                 tFontinfo;
  81. FROM mtUtils            IMPORT  tRect;
  82. IMPORT  MagicBIOS, MagicDOS, MagicAES, MagicVDI;
  83.  
  84.  
  85.  
  86. (*--------------------------------------------------------------------------*
  87.  *                      Zustandsflags des Terminals                         *
  88.  *--------------------------------------------------------------------------*)
  89.  
  90. CONST   cActive =       0;      (* Terminal aktiv (Vordergrund)             *)
  91.         cErase =        1;      (* Zeichen vorl”schen?                      *)
  92.         cCursor =       2;      (* Cursor ein?                              *)
  93.         cBlink =        3;      (* Cursor blinkend?                         *)
  94.         cWrap =         4;      (* Word-Wrapping                            *)
  95.         cEscape =       5;      (* Escape wurde ausgegeben                  *)
  96.         cEscYs =        6;      (* Escape Y: Spaltenwert wird erwartet      *)
  97.         cEscYz =        7;      (* Escape Y: Zeilenwert wird erwartet       *)
  98.         cEscb =         8;      (* Escape b: Vordergrundfarbe wird erwartet *)
  99.         cEscc =         9;      (* Escape c: Hintergrundfarbe wird erwartet *)
  100.         cBColor =      10;      (* Hintergrundfarbe beim Schreiben          *)
  101.         cRedraw =      11;      (* Redrawfeature eingeschaltet              *)
  102.         cFSM =         12;      (* Gesetzt wenn der Font ein FSM-Font ist   *)
  103.         cFlag13 =      13;
  104.         cFlag14 =      14;
  105.         cFlag15 =      15;
  106.  
  107. (*--------------------------------------------------------------------------*)
  108.  
  109. TYPE    TERMINAL =      POINTER TO TerminalTyp;
  110.         TerminalTyp =   RECORD
  111.                          x:       sINTEGER;  (* X-Koordinate                 *)
  112.                          y:       sINTEGER;  (* Y-Koordinate                 *)
  113.                          px:      sINTEGER;  (* X-Pixelpos des Cursor        *)
  114.                          py:      sINTEGER;  (* Y-Pixelpos des Cursors       *)
  115.                          mx:      sINTEGER;  (* Position rechter Rand        *)
  116.                          my:      sINTEGER;  (* Position linker Rand         *)
  117.                          lastCol: sINTEGER;  (* Pixelpos der letzten Spalte  *)
  118.                          lastLn:  sINTEGER;  (* Pixelpos der letzten Zeile   *)
  119.                          zBreite: sINTEGER;  (* Zeichenbreite                *)
  120.                          zHoehe:  sINTEGER;  (* Zeichenh”he                  *)
  121.                          pmx:     sINTEGER;  (* Cursor-Breite                *)
  122.                          pmy:     sINTEGER;  (* Cursor-H”he                  *)
  123.                          sx:      sINTEGER;  (*  *)
  124.                          sy:      sINTEGER;  (*  *)
  125.                          ox:      sINTEGER;  (*  *)
  126.                          xoff:    sINTEGER;  (* Offset fr kursive Schrift   *)
  127.                          yoff:    sINTEGER;  (* fr tiefgestellte Schrift    *)
  128.                          w:       sINTEGER;  (* Breite in Pixel              *)
  129.                          h:       sINTEGER;  (* H”he in Pixel                *)
  130.                          sp:      sINTEGER;  (* Anzahl der Spalten           *)
  131.                          zl:      sINTEGER;  (* Anzahl der Zeilen            *)
  132.                          wert1:   sINTEGER;  (* Zwischenspeicher             *)
  133.                          wert2:   sINTEGER;  (* Zwischenspeicher             *)
  134.                          vColor:  sINTEGER;  (* Vordergrundfarbe (Text)      *)
  135.                          hColor:  sINTEGER;  (* Hintergrundfarbe             *)
  136.                          tab:     sINTEGER;  (* Tabweite                     *)
  137.                          size:    sINTEGER;  (* Fontgr”že                    *)
  138.                          full:    sINTEGER;  (* Volle Fontgr”že              *)
  139.                          half:    sINTEGER;  (* Halbe Fontgr”že              *)
  140.                          font:    sINTEGER;  (* Fontnummer                   *)
  141.                          effect:  Attribut;  (* Texteffekte                  *)
  142.                          zustand: sBITSET;   (* Zustand des Terminals        *)
  143.                         END; (* TerminalTyp *)
  144.  
  145. (*--------------------------------------------------------------------------*)
  146.  
  147. VAR     d, q:           MagicVDI.MFDB;
  148.         dPtr:           ADDRESS;
  149.         qPtr:           ADDRESS;
  150.  
  151. VAR     control7:       POINTER TO ADDRESS;
  152.         control9:       POINTER TO ADDRESS;
  153.  
  154. VAR     InversHandle:   sINTEGER;
  155.         NormalHandle:   sINTEGER;
  156.  
  157. VAR     rect:           tRect; 
  158.         rect2:          tRect;
  159.  
  160. VAR     Status:         sINTEGER;
  161.         
  162. VAR     MaxLines:       sINTEGER;  (* max. Anzahl Zeilen des Bildschirms     *)
  163.         MaxColumns:     sINTEGER;  (* max. Anzahl Spalten des Bildschirms    *)
  164.         MinX:           sINTEGER;  (* Ursprung des Bildschirms               *)
  165.         MinY:           sINTEGER;
  166.  
  167. (*--------------------------------------------------------------------------*)
  168.  
  169.  
  170.   VAR conterm[0484H]: ByteSet;  
  171.  
  172.  
  173.  
  174. PROCEDURE Glocke;
  175. CONST glocke = 2;
  176. VAR   stack:   ADDRESS;
  177. BEGIN
  178.  stack:= 0;  MagicDOS.Super (stack);
  179.  
  180.  
  181.  
  182.  
  183.   IF (glocke IN conterm) THEN  MagicBIOS.Bconout (MagicBIOS.CON, CHR(7));  END;
  184.  
  185.  MagicDOS.Super (stack);
  186. END Glocke;
  187.  
  188. PROCEDURE Cursor;
  189. (* Schaltet Cursor ein und aus, XOR-Modus *)
  190. BEGIN
  191.  WITH Terminal^ DO
  192.   IF cCursor IN zustand THEN
  193.    VDIPtsIn[0]:= px;
  194.    VDIPtsIn[1]:= py;
  195.    VDIPtsIn[2]:= pmx;
  196.    VDIPtsIn[3]:= pmy;
  197.    VDICall(114, 2, 0, 0, InversHandle);
  198.   END; (* IF cCursor *)
  199.  END; (* WITH *)
  200. END Cursor;
  201.  
  202. PROCEDURE Scrollup;
  203. (* Geht davon aus, daž Maus und Cursor aus sind. Diese Routine wird nur
  204.  * intern aufgerufen, so daž dieses Vorgehen keine Probleme bereitet
  205.  *)
  206. BEGIN
  207.  WITH Terminal^ DO
  208.   VDIPtsIn[0]:= x;
  209.   VDIPtsIn[1]:= y + zHoehe;
  210.   VDIPtsIn[2]:= mx;
  211.   VDIPtsIn[3]:= my;
  212.   VDIPtsIn[4]:= x;
  213.   VDIPtsIn[5]:= y;
  214.   VDIPtsIn[6]:= mx;
  215.   VDIPtsIn[7]:= lastLn;
  216.   VDIIntIn[0]:= 3;
  217.   control7^:= qPtr;
  218.   control9^:= dPtr;
  219.   VDICall(109, 4, 1, 0, NormalHandle);
  220.   VDIPtsIn[0]:= x;
  221.   VDIPtsIn[1]:= lastLn;
  222.   VDIPtsIn[2]:= mx;
  223.   VDIPtsIn[3]:= my;
  224.   VDICall (114, 2, 0, 0, NormalHandle);
  225.  END;
  226. END Scrollup;
  227.  
  228. PROCEDURE Emulator (ch: CHAR);
  229. (* Handled alles, was mit Escape eingeleitet wurde *)
  230. BEGIN
  231.  WITH Terminal^ DO
  232.   IF cEscYs IN zustand THEN
  233.    wert1:= ORD(ch) - 32;
  234.    EXCL (zustand, cEscYs);  INCL (zustand, cEscYz);  RETURN;
  235.   END;
  236.   IF cEscYz IN zustand THEN
  237.    wert2:= ORD(ch) - 32;  IF wert2 < 0 THEN wert2:= 0; END;
  238.    GotoXY (wert2, wert1);
  239.    EXCL (zustand, cEscYz);  EXCL (zustand, cEscape);  RETURN;
  240.   END;   
  241.   IF cEscb IN zustand THEN
  242.    ForegroundColor (ORD (ch));
  243.    EXCL (zustand, cEscb);  EXCL (zustand, cEscape);  RETURN;
  244.   END;   
  245.   IF cEscc IN zustand THEN
  246.    BackgroundColor (ORD (ch));
  247.    EXCL (zustand, cEscc);  EXCL (zustand, cEscape);  RETURN;
  248.   END;
  249.   CASE ch OF
  250.    'A': IF py > y  THEN  DEC (py, zHoehe);  DEC (pmy, zHoehe);  END;|
  251.    'B': IF py < lastLn  THEN  INC (py, zHoehe);  INC (pmy, zHoehe);  END;|
  252.    'C': IF px < lastCol  THEN INC(px, zBreite);  INC(pmx, zBreite);  END;|
  253.    'D': IF px > x  THEN  DEC (px, zBreite);  DEC (pmx, zBreite);  END;|
  254.    'E': ClearScreen;|
  255.    'H': GotoXY (0, 0);|
  256.    'I': IF py > y THEN  DEC (py, zHoehe);  DEC (pmy, zHoehe);  END;
  257.         IF py = y THEN  InsertLine;  END;|
  258.    'J': ClearEndOfScreen;|
  259.    'K': ClearEndOfLine;|
  260.    'L': InsertLine;|
  261.    'M': DeleteLine;|
  262.    'Y': INCL (zustand, cEscYs);  RETURN;|
  263.    'b': INCL (zustand, cEscb);   RETURN;|
  264.    'c': INCL (zustand, cEscc);   RETURN;|
  265.    'd': ClearStartOfScreen;|
  266.    'e': CursorOn;|
  267.    'f': CursorOff;|
  268.    'j': sx:= px;  sy:= py;|
  269.    'k': px:= sx;  py:= sy;  pmx:= px + zBreite;  pmy:= py + zHoehe;|
  270.    'l': ClearLine;  px:= x;  pmx:= px + zBreite;|
  271.    'o': ClearStartOfLine;|
  272.    'p': INCL (effect, invers);|
  273.    'q': EXCL (effect, invers);|
  274.    'v': INCL (zustand, cWrap);|
  275.    'w': EXCL (zustand, cWrap);|
  276.    200C..377C: SetAttribut (Attribut (ch));|
  277.    ELSE;
  278.   END; (* CASE *)
  279.   EXCL(zustand, cEscape);
  280.  END; (* WITH *)  
  281. END Emulator;
  282.  
  283. PROCEDURE ControlChar (ch: CHAR);
  284. (* Bearbeitet alles was kleiner als Blank ist *)
  285. VAR b: Attribut;
  286.     s: sINTEGER;
  287. BEGIN
  288.  WITH Terminal^ DO
  289.   CASE ORD(ch) OF
  290.     0:  |
  291.     7:  Glocke;
  292.         |
  293.     8:  (* Backspace *)
  294.         IF px > x THEN  DEC (px, zBreite);  DEC (pmx, zBreite); END;
  295.         VDIPtsIn[0]:= px;  VDIPtsIn[1]:= py;
  296.         VDIPtsIn[2]:= pmx;  VDIPtsIn[3]:= pmy;
  297.         VDICall (114, 2, 0, 0, NormalHandle);
  298.         |
  299.     9:  (* TAB *)
  300.         s:= x + (((((px - x) DIV zBreite) DIV tab) + 1) * tab) * zBreite;
  301.         DEC (s, zBreite);
  302.         IF (px + s) < lastCol THEN  px:= s;  ELSE  px:= lastCol;  END;
  303.         pmx:= px + zBreite;
  304.         |
  305.    10:  (* Linefeed *)
  306.         INC(py, zHoehe);
  307.         IF py > lastLn THEN  py:= lastLn;  Scrollup;  END;
  308.         pmy:= py + zHoehe;
  309.         |
  310.    12:  (* Home *)
  311.         ClearScreen;
  312.         |
  313.    13:  (* Carriage-Return *)
  314.         px:= x;  pmx:= px + zBreite;
  315.         |
  316.    27:  (* Escape *)
  317.         INCL(zustand, cEscape);
  318.         |
  319.    ELSE b:= effect;  INCL (effect, invers);
  320.         WriteChar (CHR(ORD(ch)+ 64));
  321.         effect:= b;
  322.   END; (* CASE *)
  323.  END; (* WITH *)
  324. END ControlChar;
  325.  
  326. PROCEDURE DoWrite (anzahl: sINTEGER);
  327. BEGIN
  328.  WITH Terminal^ DO
  329.   (* Position *)
  330.   VDIPtsIn[0]:= ox;
  331.   VDIPtsIn[1]:= py;
  332.   (* Vorl”schen? *)
  333.   IF {cErase, cBColor} <= zustand THEN
  334.    VDIPtsIn[2]:= px;  VDIPtsIn[3]:= pmy;
  335.    VDICall (114, 2, 0, 0, NormalHandle);
  336.   END;
  337.   INC (VDIPtsIn[0], xoff);
  338.   INC (VDIPtsIn[1], yoff);
  339.   VDICall (8, 1, anzahl, 0, TextHandle);
  340.   (* Invers? *)
  341.   IF invers IN effect THEN
  342.    VDIPtsIn[0]:= ox;
  343.    VDIPtsIn[1]:= py;
  344.    VDIPtsIn[2]:= px - sINTEGER(1);
  345.    VDIPtsIn[3]:= pmy;
  346.    VDICall (114, 2, 0, 0, InversHandle);
  347.   END;
  348.  END;
  349. END DoWrite;
  350.  
  351. PROCEDURE WriteChar (ch: CHAR);
  352. VAR i: sINTEGER;
  353. BEGIN
  354.  MouseOff;  Cursor;
  355.  WITH Terminal^ DO
  356.   IF cEscape IN zustand THEN
  357.    Emulator(ch);   (* Esape-Code abhandeln *)
  358.  
  359.   ELSIF  ORD(ch) < 32 THEN
  360.    ControlChar(ch);  (* Control-Code abhandeln *)
  361.  
  362.   ELSE
  363.   
  364.    (* Normales Zeichen *)
  365.    IF px > lastCol THEN
  366.     IF cWrap IN zustand THEN
  367.      px:= x;  INC(py, zHoehe);
  368.      IF py > lastLn THEN  py:= lastLn;  Scrollup;  END;
  369.      pmx:= px + zBreite;  pmy:= py + zHoehe;
  370.     ELSE
  371.      px:= lastCol;  pmx:= px + zBreite;
  372.     END;
  373.    END;
  374.    ox:= px;  INC(px, zBreite);
  375.    VDIIntIn[0]:= ORD(ch);  VDIIntIn[1]:= 0;
  376.    DoWrite (1);
  377.    pmx:= px + zBreite;  pmy:= py + zHoehe;
  378.    Cursor;
  379.   END; (* IF *)
  380.  END; (* WITH *)
  381.  MouseOn;
  382. END WriteChar;
  383.  
  384. PROCEDURE XconWrite (ch: CHAR);
  385. (* Nur fr xconout-Routine *)
  386. VAR i: sINTEGER;
  387. BEGIN
  388.  Cursor;
  389.  WITH Terminal^ DO
  390.   IF cEscape IN zustand THEN
  391.    Emulator(ch);   (* Esape-Code abhandeln *)
  392.  
  393.   ELSIF  ORD(ch) < 32 THEN
  394.    ControlChar(ch);  (* Control-Code abhandeln *)
  395.  
  396.   ELSE
  397.    (* Normales Zeichen *)
  398.    IF px > lastCol THEN
  399.     IF cWrap IN zustand THEN
  400.      px:= x;  INC(py, zHoehe);
  401.      IF py > lastLn THEN  py:= lastLn;  Scrollup;  END;
  402.      pmx:= px + zBreite;  pmy:= py + zHoehe;
  403.     ELSE
  404.      px:= lastCol;  pmx:= px + zBreite;
  405.     END;
  406.    END;
  407.    ox:= px;  INC(px, zBreite);
  408.    VDIIntIn[0]:= ORD(ch);  VDIIntIn[1]:= 0;
  409.    DoWrite (1);
  410.    pmx:= px + zBreite;  pmy:= py + zHoehe;
  411.    Cursor;
  412.   END; (* IF *)
  413.  END; (* WITH *)
  414. END XconWrite;
  415.  
  416.  
  417.  PROCEDURE WriteLine (REF string: ARRAY OF CHAR); 
  418.  
  419. VAR c, d, l: sCARDINAL;
  420.     i, j: sINTEGER;
  421.     char: CHAR;
  422. BEGIN
  423.  MouseOff;  Cursor;  c:= 0;  l:= HIGH(string);
  424.  LOOP
  425.   IF (c > l) THEN  EXIT;  END;  (* String zu Ende *)
  426.   CASE ORD (string[c]) OF
  427.     0:      EXIT; (* String zu Ende *)
  428.             |
  429.    27:      INC(c);
  430.             INCL(Terminal^.zustand, cEscape);
  431.             WHILE cEscape IN Terminal^.zustand DO
  432.              Emulator (string[c]);
  433.              INC(c);  IF (c > l) THEN  EXIT;  END;
  434.             END;
  435.             |
  436.    1..26,
  437.    28..31:  ControlChar(string[c]);  INC(c);
  438.             |
  439.    ELSE  (* Scanne String bis Zeichen < Blank und gebe ihn aus *)
  440.     WITH Terminal^ DO
  441.      d:= 0;  ox:= px;  
  442.      WHILE (px <= lastCol) & (string[c] > 37C) & (c <= l) DO
  443.       VDIIntIn[d]:= ORD(string[c]);  INC(d);  INC(c);  INC(px, zBreite);
  444.      END;
  445.      VDIIntIn[d]:= 0;
  446.      IF ox < lastCol THEN  DoWrite (d);  END;
  447.      IF px >= lastCol THEN
  448.       IF cWrap IN zustand THEN
  449.        px:= x;  INC(py, zHoehe);
  450.        IF py > lastLn THEN py:= lastLn;  Scrollup; END;
  451.        pmx:= px + zBreite;  pmy:= py + zHoehe;
  452.       ELSE
  453.        px:= lastCol;  pmx:= px + zBreite;
  454.       END;
  455.      END;
  456.     END; (* WITH *)
  457.   END; (* CASE *)
  458.  END; (* LOOP *)
  459.  WITH Terminal^ DO  pmx:= px + zBreite;  END;
  460.  Cursor;
  461. END WriteLine;
  462.  
  463. PROCEDURE WriteConst (REF string: ARRAY OF CHAR);
  464. BEGIN
  465.  WriteLine(string);
  466. END WriteConst;
  467.  
  468. PROCEDURE WriteLn;
  469. BEGIN
  470.  MouseOff;  Cursor;
  471.  WITH Terminal^ DO
  472.   px:= x;
  473.   INC(py, zHoehe);
  474.   IF py > lastLn THEN py:= lastLn;  Scrollup; END;
  475.   pmx:= px + zBreite;  pmy:= py + zHoehe;
  476.  END;
  477.  Cursor;
  478. END WriteLn;
  479.  
  480. VAR string: ARRAY [0..255] OF CHAR;
  481.  
  482. PROCEDURE WriteCard (wert: sCARDINAL; len: sCARDINAL);
  483. BEGIN
  484.  CardToStr (wert, len, string);
  485.  WriteLine (string);
  486. END WriteCard;
  487.  
  488. PROCEDURE WriteInt (wert: sINTEGER; len: sCARDINAL);
  489. BEGIN
  490.  IntToStr (wert, len, string);
  491.  WriteLine (string);
  492. END WriteInt;
  493.  
  494. PROCEDURE WriteLongCard (wert: lCARDINAL; len: sCARDINAL);
  495. BEGIN
  496.  LCardToStr (wert, len, string);
  497.  WriteLine (string);
  498. END WriteLongCard;
  499.  
  500. PROCEDURE WriteLongInt (wert: lINTEGER;  len: sCARDINAL);
  501. BEGIN
  502.  LIntToStr (wert, len, string);
  503.  WriteLine (string);
  504. END WriteLongInt;
  505.  
  506. PROCEDURE WriteReal (wert: REAL; len: sCARDINAL);
  507. BEGIN
  508.  RealToStr (wert, len, string);
  509.  WriteLine (string);
  510. END WriteReal;
  511.  
  512. PROCEDURE WriteLongReal (wert: LONGREAL; len: sCARDINAL);
  513. BEGIN
  514.  LRealToStr (wert, len, string);
  515.  WriteLine (string);
  516. END WriteLongReal;
  517.  
  518. PROCEDURE WriteFixReal (wert: REAL; len, fix: sCARDINAL);
  519. BEGIN
  520.  FixRealToStr (wert, len, fix, string);
  521.  WriteLine (string);
  522. END WriteFixReal;
  523.  
  524. PROCEDURE WriteFixLReal (wert: LONGREAL; len, fix: sCARDINAL);
  525. BEGIN
  526.  FixLRealToStr (wert, len, fix, string);
  527.  WriteLine (string);
  528. END WriteFixLReal;
  529.  
  530. PROCEDURE InsertLine;
  531. BEGIN
  532.  WITH Terminal^ DO
  533.   MouseOff;  Cursor;  px:= x;  pmx:= px + zBreite;
  534.   VDIPtsIn[0]:= px;
  535.   VDIPtsIn[1]:= py;
  536.   VDIPtsIn[2]:= mx;
  537.   VDIPtsIn[3]:= my - zHoehe;
  538.   VDIPtsIn[4]:= px;
  539.   VDIPtsIn[5]:= py + zHoehe;
  540.   VDIPtsIn[6]:= mx;
  541.   VDIPtsIn[7]:= my;
  542.   VDIIntIn[0]:= 3;
  543.   control7^:= qPtr;
  544.   control9^:= dPtr;
  545.   VDICall (109, 4, 1, 0, NormalHandle);
  546.   VDIPtsIn[0]:= x;
  547.   VDIPtsIn[1]:= py;
  548.   VDIPtsIn[2]:= mx;
  549.   VDIPtsIn[3]:= pmy;
  550.   VDICall (114, 2, 0, 0, NormalHandle);
  551.  END;
  552. END InsertLine;
  553.  
  554. PROCEDURE DeleteLine;
  555. BEGIN
  556.  WITH Terminal^ DO
  557.   MouseOff;  Cursor;  px:= x;  pmx:= px + zBreite;
  558.   VDIPtsIn[0]:= px;
  559.   VDIPtsIn[1]:= py + zHoehe;
  560.   VDIPtsIn[2]:= mx;
  561.   VDIPtsIn[3]:= my;
  562.   VDIPtsIn[4]:= px;
  563.   VDIPtsIn[5]:= py;
  564.   VDIPtsIn[6]:= mx;
  565.   VDIPtsIn[7]:= lastLn;
  566.   VDIIntIn[0]:= 3;
  567.   control7^:= qPtr;
  568.   control9^:= dPtr;
  569.   VDICall (109, 4, 1, 0, NormalHandle);
  570.   VDIPtsIn[0]:= x;
  571.   VDIPtsIn[1]:= lastLn;
  572.   VDIPtsIn[2]:= mx;
  573.   VDIPtsIn[3]:= my;
  574.   VDICall (114, 2, 0, 0, NormalHandle);
  575.  END;
  576. END DeleteLine;
  577.  
  578. PROCEDURE WhereXY (VAR spalte, zeile: sCARDINAL);
  579. BEGIN
  580.  WITH Terminal^ DO
  581.   spalte:= (px - x) DIV zBreite;
  582.   zeile:=  (py - y) DIV zHoehe;
  583.  END;
  584. END WhereXY;
  585.  
  586. PROCEDURE GotoXY (spalte, zeile: sCARDINAL);
  587. (* Die Home-Position wurde auf 0, 0 festgelegt *)
  588. BEGIN
  589.  WITH Terminal^ DO
  590.   MouseOff;  Cursor; (* Cursor ausschalten *)
  591.   px:= x + (CastToInt (spalte) * zBreite); 
  592.   py:= y + (CastToInt (zeile) * zHoehe);
  593.   IF px < x THEN px:= x; END;
  594.   IF py < y THEN py:= y; END;
  595.   IF px > mx THEN px:= mx - zBreite; END;
  596.   IF py > lastLn THEN py:= lastLn; END;
  597.   pmx:= px + zBreite;  pmy:= py + zHoehe;
  598.   Cursor;
  599.  END; (* WITH *)
  600. END GotoXY;
  601.  
  602. PROCEDURE WhereCursor (VAR x, y: sINTEGER);
  603. BEGIN
  604.  x:= Terminal^.px;
  605.  y:= Terminal^.py;
  606. END WhereCursor;
  607.  
  608. PROCEDURE SetCursor (xx, yy: sINTEGER);
  609. VAR bb, hh: sINTEGER;
  610. BEGIN
  611.  WITH Terminal^ DO
  612.   MouseOff;  Cursor; (* Cursor ausschalten *)
  613.   px:= xx;  py:= yy;
  614.   IF px < x THEN px:= x; END;
  615.   IF py < y THEN py:= y; END;
  616.   IF px > mx THEN px:= mx - zBreite; END;
  617.   IF py > lastLn THEN py:= lastLn; END;
  618.   pmx:= px + 2;
  619.   pmy:= py + zHoehe - 1;
  620.   Cursor;
  621.  END; (* WITH *)
  622. END SetCursor;
  623.  
  624. PROCEDURE CursorOn;
  625. BEGIN
  626.  IF NOT (cCursor IN Terminal^.zustand) THEN
  627.   MouseOff;  INCL(Terminal^.zustand, cCursor);  Cursor;
  628.  END;
  629. END CursorOn;
  630.  
  631. PROCEDURE CursorOff;
  632. BEGIN
  633.  IF cCursor IN Terminal^.zustand THEN
  634.   MouseOff;  Cursor;  EXCL(Terminal^.zustand, cCursor);
  635.  END;
  636. END CursorOff;
  637.  
  638. PROCEDURE CursorStop;
  639. (* Wird ggw. nicht untersttzt *)
  640. END CursorStop;
  641.  
  642. PROCEDURE CursorBlink;
  643. (* Wird ggw. nicht untersttzt *)
  644. END CursorBlink;
  645.  
  646. PROCEDURE WrapOff;
  647. BEGIN
  648.  EXCL(Terminal^.zustand, cWrap);
  649. END WrapOff;
  650.  
  651. PROCEDURE WrapOn;
  652. BEGIN
  653.  INCL(Terminal^.zustand, cWrap);
  654. END WrapOn;
  655.  
  656. PROCEDURE ClearLine;
  657. BEGIN
  658.  WITH Terminal^ DO
  659.   MouseOff;  Cursor;  px:= x;  pmx:= px + zBreite;
  660.   VDIPtsIn[0]:= x;
  661.   VDIPtsIn[1]:= py;
  662.   VDIPtsIn[2]:= x + w -1;
  663.   VDIPtsIn[3]:= pmy;
  664.   VDICall (114, 2, 0, 0, NormalHandle);
  665.   Cursor;
  666.  END;
  667. END ClearLine;
  668.  
  669. PROCEDURE ClearStartOfLine;
  670. BEGIN
  671.  WITH Terminal^ DO
  672.   MouseOff;  Cursor;
  673.   VDIPtsIn[0]:= x;
  674.   VDIPtsIn[1]:= py;
  675.   VDIPtsIn[2]:= px;
  676.   VDIPtsIn[3]:= pmy;
  677.   VDICall (114, 2, 0, 0, NormalHandle);
  678.   Cursor;
  679.  END;
  680. END ClearStartOfLine;
  681.  
  682. PROCEDURE ClearEndOfLine;
  683. BEGIN
  684.  WITH Terminal^ DO
  685.   MouseOff;  Cursor;
  686.   VDIPtsIn[0]:= px;
  687.   VDIPtsIn[1]:= py;
  688.   VDIPtsIn[2]:= x + w - 1;
  689.   VDIPtsIn[3]:= pmy;
  690.   VDICall (114, 2, 0, 0, NormalHandle);
  691.   Cursor;
  692.  END;
  693. END ClearEndOfLine;
  694.  
  695. PROCEDURE ClearScreen;
  696. BEGIN
  697.  WITH Terminal^ DO
  698.   MouseOff;  Cursor;  GotoXY (0, 0);
  699.   VDIPtsIn[0]:= px;
  700.   VDIPtsIn[1]:= py;
  701.   VDIPtsIn[2]:= x + w - 1;
  702.   VDIPtsIn[3]:= y + h - 1;
  703.   VDICall (114, 2, 0, 0, NormalHandle);
  704.   Cursor;
  705.  END; (* WITH *)
  706. END ClearScreen;
  707.  
  708. PROCEDURE ClearStartOfScreen;
  709. BEGIN
  710.  WITH Terminal^ DO
  711.   MouseOff;  Cursor;
  712.   VDIPtsIn[0]:= px;
  713.   VDIPtsIn[1]:= py;
  714.   VDIPtsIn[2]:= x;
  715.   VDIPtsIn[3]:= pmy;
  716.   VDICall (114, 2, 0, 0, NormalHandle);
  717.   VDIPtsIn[0]:= x;
  718.   VDIPtsIn[1]:= y;
  719.   VDIPtsIn[2]:= x + w - 1;
  720.   VDIPtsIn[3]:= py;
  721.   VDICall (114, 2, 0, 0, NormalHandle);
  722.   Cursor;
  723.  END; (* WITH *)
  724. END ClearStartOfScreen;
  725.  
  726. PROCEDURE ClearEndOfScreen;
  727. BEGIN
  728.  WITH Terminal^ DO
  729.   MouseOff;  Cursor;
  730.   VDIPtsIn[0]:= px;
  731.   VDIPtsIn[1]:= py;
  732.   VDIPtsIn[2]:= x + w - 1;
  733.   VDIPtsIn[3]:= pmy;
  734.   VDICall (114, 2, 0, 0, NormalHandle);
  735.   VDIPtsIn[0]:= x;
  736.   VDIPtsIn[1]:= py + zHoehe;
  737.   VDIPtsIn[2]:= x + w - 1;
  738.   VDIPtsIn[3]:= y + h - 1;
  739.   VDICall (114, 2, 0, 0, NormalHandle);
  740.   Cursor;
  741.  END; (* WITH *)
  742. END ClearEndOfScreen;
  743.  
  744. PROCEDURE ForegroundColor (color: sINTEGER);
  745. VAR old: sINTEGER;
  746. BEGIN
  747.  Terminal^.vColor:= color;
  748.  old:= MagicVDI.SetTextcolor (TextHandle, color);
  749.  old:= MagicVDI.SetFillcolor (InversHandle, color); 
  750. END ForegroundColor;
  751.  
  752. PROCEDURE BackgroundColor (color: sINTEGER);
  753. VAR old, wm: sINTEGER;
  754. BEGIN
  755.  Terminal^.hColor:= color;
  756.  old:= MagicVDI.SetFillcolor (NormalHandle, color); 
  757.  IF color > 0 THEN
  758.   INCL (Terminal^.zustand, cBColor);
  759.   wm:= MagicVDI.SetWritemode (TextHandle, MagicVDI.XOR);
  760.  ELSE
  761.   EXCL (Terminal^.zustand, cBColor);
  762.   wm:= MagicVDI.SetWritemode (TextHandle, MagicVDI.REPLACE);
  763.  END;
  764. END BackgroundColor;
  765.  
  766. PROCEDURE InversOn;
  767. BEGIN
  768.  INCL (Terminal^.effect, invers);
  769. END InversOn;
  770.  
  771. PROCEDURE InversOff;
  772. BEGIN
  773.  EXCL (Terminal^.effect, invers);
  774. END InversOff;
  775.  
  776. PROCEDURE SetAttribut (attrib: Attribut);
  777. VAR i:  sINTEGER;
  778.     bs: sBITSET;
  779. BEGIN
  780.  MouseOff;
  781.  WITH Terminal^ DO
  782.   IF Attribut{subscript, superscript, italic} <= attrib THEN
  783.    (* Das zu schreibende Zeichen muž am Bildschirm vorgel”scht werden *)
  784.    INCL(zustand, cErase);
  785.   END;
  786.  
  787.   (* Bei kursiver Schrift muž das Zeichen um einen Offset nach rechts
  788.    * verschoben werden, da durch die Umsetzung des Alignments das Zeichen
  789.    * nach links gezeichnet wird (kompliziert, ich geb's zu...)
  790.    *)
  791.   IF italic IN attrib THEN
  792.    xoff:= zBreite DIV 2;
  793.    rect.x:= x;  rect.y:= y;  rect.w:= x + w - 2;  rect.h:= y + h - 2;
  794.    MagicVDI.SetClipping(TextHandle, rect, TRUE);
  795.   ELSIF italic IN effect THEN
  796.    xoff:= 0;
  797.    MagicVDI.SetClipping(TextHandle, rect, FALSE);
  798.   ELSE
  799.    xoff:= 0;
  800.   END;
  801.  
  802.   (* Beim Tiefstellen von Zeichen muž noch ein Offset addiert werden,
  803.    * da unsere Cursorposition immer die oberste Rasterzeile des Zeichens
  804.    * beschreibt.
  805.    *)
  806.   IF Attribut{subscript, superscript} <= attrib THEN
  807.    yoff:= zHoehe DIV 4;
  808.    size:= MagicVDI.SetCharpoints (TextHandle, half, i, i, i, i);
  809.   ELSIF subscript IN attrib THEN
  810.    yoff:= zHoehe DIV 2;
  811.    size:= MagicVDI.SetCharpoints (TextHandle, half, i, i, i, i);
  812.   ELSIF superscript IN attrib THEN
  813.    yoff:= 0;
  814.    size:= MagicVDI.SetCharpoints (TextHandle, half, i, i, i, i);
  815.   ELSE (* Normale Zeichenh”he *)
  816.    yoff:= 0;
  817.    size:= MagicVDI.SetCharpoints (TextHandle, full, i, i, i, i);
  818.   END;
  819.  
  820.   (* Leider werden nicht alle verwendeten Attribute vom VDI untersttzt.
  821.    * So werden Hoch-, Tiefstellen und Invers in MagicTerm emuliert.
  822.    * Diese Bits mssen wir ausblenden, sonst gibts Verwirrung
  823.    *)
  824.   bs:= {};
  825.   IF fat IN attrib THEN  INCL (bs, MagicVDI.Fat);  END;
  826.   IF light IN attrib THEN  INCL (bs, MagicVDI.Light);  END;
  827.   IF italic IN attrib THEN  INCL (bs, MagicVDI.Italic);  END;
  828.   IF underline IN attrib THEN  INCL (bs, MagicVDI.Underline);  END;
  829.    
  830.   VDIIntIn[0]:= CastToInt (bs);
  831.   
  832.   VDICall (106, 0, 1, 0, TextHandle);
  833.  
  834.   effect:= attrib;
  835.  END; (* WITH *)
  836. END SetAttribut;
  837.  
  838. PROCEDURE SetTabspace (tab: sINTEGER);
  839. BEGIN
  840.  Terminal^.tab:= tab;
  841. END SetTabspace;
  842.  
  843. PROCEDURE SetParameter;
  844. BEGIN
  845.  WITH Terminal^ DO
  846.   Lines:= zl;  Columns:= sp;
  847.   Xpos:= x;  Ypos:= y;  Width:= w;  Height:= h;
  848.   CurrWidth:= zBreite;  CurrHeight:= zHoehe;
  849.  END;
  850. END SetParameter;
  851.  
  852. (*--------------------------------------------------------------------------*
  853.  *                              GDOS-Fonthandling                           *
  854.  *--------------------------------------------------------------------------*)
  855.  
  856. PROCEDURE UpdateTerminal;
  857. VAR info: tFontinfo;
  858. BEGIN
  859.  WITH Terminal^ DO
  860.   font:= FontActive (TextHandle);
  861.   FontInfo (TextHandle, font, info);
  862.   size:= info.point;  full:= info.point;
  863.   IF info.fsm THEN INCL (Terminal^.zustand, cFSM);  half:= full DIV 2;
  864.               ELSE EXCL (Terminal^.zustand, cFSM);  half:= full - 1;
  865.   END;
  866.   zBreite:= info.boxw;
  867.   zHoehe:= info.boxh;
  868.   sp:= w DIV zBreite;
  869.   zl:= h DIV zHoehe;
  870.   mx:= x + (sp * zBreite) - 1;
  871.   my:= y + (zl * zHoehe) - 1;
  872.   lastCol:= mx - zBreite + 1;
  873.   lastLn:=  my - zHoehe + 1;
  874.   px:= x;
  875.   py:= y;
  876.   pmx:= x + zBreite;
  877.   pmy:= y + zHoehe;
  878.  END;
  879.  SetParameter;
  880. END UpdateTerminal;
  881.  
  882. (*--------------------------------------------------------------------------*
  883.  *                      Support fr mehrere Terminals                       *
  884.  *--------------------------------------------------------------------------*)
  885.  
  886. VAR     a, b, c:        sINTEGER;
  887.         count:          sINTEGER;
  888.  
  889.  
  890. PROCEDURE OpenTerminal (rect: ARRAY OF LOC): TERMINAL;
  891. VAR term:       TERMINAL;
  892.     r:          POINTER TO tRect;
  893.     i, j, s:    sINTEGER;
  894.     info:       tFontinfo;
  895. BEGIN
  896.  ALLOCATE (term,  TSIZE(TerminalTyp));  
  897.  IF term # NIL THEN
  898.   WITH term^ DO
  899.    r:= ADR (rect);  x:= r^.x;  y:= r^.y;  w:= r^.w;  h:= r^.h;
  900.    IF (w + x) > MaxWidth  THEN  w:= MaxWidth - x;   END;
  901.    IF (h + y) > MaxHeight THEN  h:= MaxHeight - y;  END;
  902.    font:= FontActive (TextHandle);
  903.    FontInfo (TextHandle, font, info);
  904.    size:= info.point;  full:= info.point;
  905.    IF info.fsm THEN INCL (term^.zustand, cFSM);  half:= full DIV 2;
  906.                ELSE EXCL (term^.zustand, cFSM);  half:= full - 1;
  907.    END;
  908.    zBreite:= info.boxw;
  909.    zHoehe:= info.boxh;
  910.    sp:= w DIV zBreite;
  911.    zl:= h DIV zHoehe;
  912.    mx:= x + (sp * zBreite) - 1;
  913.    my:= y + (zl * zHoehe) - 1;
  914.    lastCol:= mx - zBreite + 1;
  915.    lastLn:=  my - zHoehe + 1;
  916.    px:= x;
  917.    py:= y;
  918.    pmx:= x + zBreite;
  919.    pmy:= y + zHoehe;
  920.    vColor:= 1;
  921.    hColor:= 0;
  922.    xoff:= 0;
  923.    yoff:= 0;
  924.    tab:= 8;
  925.    effect:= Attribut{};  zustand:= {};
  926.   END; (* WITH *)
  927.  END;
  928.  RETURN term;
  929. END OpenTerminal;
  930.          
  931. PROCEDURE CloseTerminal (VAR term: TERMINAL);
  932. BEGIN
  933.  DEALLOCATE (term, 0);  
  934. END CloseTerminal;
  935.  
  936. PROCEDURE ChangeTerminal (term: TERMINAL): TERMINAL;
  937. VAR old: TERMINAL;
  938. BEGIN
  939.  old:= Terminal;
  940.  EXCL (old^.zustand, cActive);  INCL (term^.zustand, cActive);
  941.  Terminal:= term;
  942.  WITH Terminal^ DO
  943.   IF old^.font # font  THEN  FontSelect (TextHandle, font);  END;
  944.   UpdateTerminal;
  945.   ForegroundColor (vColor);
  946.   BackgroundColor (hColor);
  947.   SetAttribut (effect);
  948.  END;
  949.  SetParameter;
  950.  RETURN old;
  951. END ChangeTerminal;
  952.  
  953. PROCEDURE GetMaximum (VAR rect: ARRAY OF LOC);
  954. VAR r: POINTER TO tRect;
  955. BEGIN
  956.  r:= ADR (rect);
  957.  r^.x:= MinX;  r^.y:= MinY;  r^.w:= MaxWidth;  r^.h:= MaxHeight;
  958. END GetMaximum;
  959.  
  960. PROCEDURE GetTerminal (VAR rect: ARRAY OF LOC);
  961. VAR r: POINTER TO tRect;
  962. BEGIN
  963.  r:= ADR (rect);
  964.  r^.x:= Terminal^.x;
  965.  r^.y:= Terminal^.y;
  966.  r^.w:= Terminal^.w;
  967.  r^.h:= Terminal^.h;
  968. END GetTerminal;
  969.  
  970. PROCEDURE SetTerminal (rect: ARRAY OF LOC);
  971. VAR r: POINTER TO tRect;
  972.     i, chw, chh, boxw, boxh: sINTEGER;
  973. BEGIN
  974.  WITH Terminal^ DO
  975.   r:= ADR (rect);  x:= r^.x;  y:= r^.y;  w:= r^.w;  h:= r^.h;
  976.   IF (w + x) > MaxWidth  THEN  w:= MaxWidth - x;   END;
  977.   IF (h + y) > MaxHeight THEN  h:= MaxHeight - y;  END;
  978.   UpdateTerminal;
  979.  END;
  980. END SetTerminal;
  981.  
  982. PROCEDURE ClipRect (doit: BOOLEAN; rct: ARRAY OF LOC);
  983. VAR r: POINTER TO tRect;
  984. BEGIN
  985.  r:= ADR (rct);
  986.  IF doit THEN
  987.   rect.x:= r^.x;
  988.   rect.y:= r^.y;
  989.   rect.w:= r^.x + r^.w - 1;
  990.   rect.h:= r^.y + r^.h - 1; 
  991.   MagicVDI.SetClipping(TextHandle,   rect, TRUE);
  992.   MagicVDI.SetClipping(NormalHandle, rect, TRUE);
  993.   MagicVDI.SetClipping(InversHandle, rect, TRUE);
  994.  ELSIF (italic IN Terminal^.effect) THEN
  995.   rect.x:= Terminal^.x;
  996.   rect.y:= Terminal^.y;
  997.   rect.w:= Terminal^.mx;
  998.   rect.h:= Terminal^.my;
  999.   MagicVDI.SetClipping(TextHandle, rect, TRUE);
  1000.   MagicVDI.SetClipping(NormalHandle, rect, FALSE);
  1001.   MagicVDI.SetClipping(InversHandle, rect, FALSE);
  1002.  ELSE
  1003.   MagicVDI.SetClipping(TextHandle,   rect, FALSE);
  1004.   MagicVDI.SetClipping(NormalHandle, rect, FALSE);
  1005.   MagicVDI.SetClipping(InversHandle, rect, FALSE);
  1006.  END;
  1007. END ClipRect;
  1008.  
  1009. PROCEDURE RedrawTerminal (term: TERMINAL; rect: ARRAY OF LOC);
  1010. BEGIN
  1011. END RedrawTerminal;
  1012.  
  1013. (*-------------------------------------------------------------------------*)
  1014.  
  1015. VAR j, i, i1, i2, i3, i4:  sINTEGER;
  1016.     x:  TERMINAL;
  1017.     r:  tRect;
  1018.  
  1019. BEGIN
  1020.  count:= 0;  dPtr:= ADR(d);  qPtr:= ADR(q);
  1021.  control7:= ADR (MagicVDI.VDIControl[7]);
  1022.  control9:= ADR (MagicVDI.VDIControl[9]);
  1023.  
  1024.  InversHandle:= OpenWorkstation (Screen, 0, 0, TRUE);
  1025.  i:= MagicVDI.SetWritemode (InversHandle, MagicVDI.XOR);
  1026.  i:= MagicVDI.SetFillinterior (InversHandle, MagicVDI.Full);
  1027.  i:= MagicVDI.SetFillcolor (InversHandle, 1);
  1028.  
  1029.  NormalHandle:= OpenWorkstation (Screen, 0, 0, TRUE);
  1030.  i:= MagicVDI.SetWritemode (NormalHandle, MagicVDI.REPLACE);
  1031.  i:= MagicVDI.SetFillinterior (NormalHandle, MagicVDI.Full);
  1032.  i:= MagicVDI.SetFillcolor (NormalHandle, 0);
  1033.  
  1034.  TextHandle:=   OpenWorkstation (Screen, 0, 0, TRUE);
  1035.  i:= MagicVDI.SetTextface (TextHandle, 1);
  1036.  i:= MagicVDI.SetWritemode (TextHandle, MagicVDI.REPLACE);
  1037.  i:= MagicVDI.SetTextcolor (TextHandle, 1);
  1038.  MagicVDI.SetTextalignment (TextHandle, 0, 5, i, i);
  1039.  
  1040.  r.x:= 0;  r.y:= 0;  r.w:= MaxWidth;  r.h:= MaxHeight;
  1041.  Terminal:= OpenTerminal (r);
  1042.  IF Terminal = NIL THEN HALT; END;
  1043.  Terminal^.zustand:= {cActive};
  1044.  SetParameter;
  1045. END CatTerminal.
  1046.  
  1047.